package com.example.demo.juc;

/**
 * @ClassName VolatileTest
 * @Description
 * @Author 51
 * @Date 2020年3月20日 上午11:11:34
 */
public class VolatileTest {
	public static void main1(String[] args) {

		ThreadDemo td = new ThreadDemo();
		new Thread(td).start();
		while (true) {
			if (td.isFlag()) {
				// 下面这行代码不会被执行
				System.out.println("----------");
				break;
			}
		}
	}

	public static void main2(String[] args) {

		ThreadDemo td = new ThreadDemo();
		new Thread(td).start();
		while (true) {
			synchronized (td) {// 使用同步锁解决|但是效率变低了。
				if (td.isFlag()) {
					// 下面这行代码不会被执行
					System.out.println("----------");
					break;
				}
			}
		}
	}

	/**
	 * volatile:当多个线程进行操作共享数据时，可以保证内存中的数据可见 <br>
	 * <span> 相较于synchronized 是一种较为轻量级的同步策略。
	 * 
	 * <p>
	 * 注意：<br>
	 * 1： volatile不具有互斥性。 <br>
	 * 2：不能保证变量的原子性<br>
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		ThreadDemo td = new ThreadDemo();
		new Thread(td).start();
		while (true) {
			if (td.isFlag()) {
				// 下面这行代码不会被执行
				System.out.println("----------");
				break;
			}
		}
	}
}

class ThreadDemo implements Runnable {

	private volatile boolean flag = false;

	@Override
	public void run() {

		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		flag = true;
		System.out.println("flag=" + flag);
	}

	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

}